﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using Cotizav.PRESENTACION.DialogBox;
using Cotizav.CONEXION;
using Cotizav.CONTROLADOR;
using System.Globalization;

namespace Cotizav.PRESENTACION.Equipo
{
    public partial class AgregarEquipoAlquiler : Form
    {
        private COTIZACION_DETALLE result;
        private COTIZACION_DETALLE cotDetBase;

        private EQUIPO selectedEquipo;
        private List<CARACTERISTICA> selectedListCaracteristica;
        private LISTA_TARIFA selectedListaTarifa;

        private CtrlEquipo ctEquipo;
        private CtrlCaracteristica ctCaracteristica;
        private CtrlListaTarifa ctListaTarifa;

        private string tipoCambio;
        private string moneda;

        public COTIZACION_DETALLE Result
        {
            get { return result; }
            set { result = value; }
        }
        
        public AgregarEquipoAlquiler()
        {
            InitializeComponent();

            selectedEquipo = new EQUIPO();
            selectedListCaracteristica = new List<CARACTERISTICA>();
            selectedListaTarifa = new LISTA_TARIFA();            

            ctEquipo = new CtrlEquipo();
            ctCaracteristica = new CtrlCaracteristica();
            ctListaTarifa = new CtrlListaTarifa();
        }

        public AgregarEquipoAlquiler(string tc, string mon) : this()
        {
            tipoCambio = tc;
            moneda = mon;
        }

        public AgregarEquipoAlquiler(COTIZACION_DETALLE cotDet, string tc, string mon) : this()
        {
            cotDetBase = new COTIZACION_DETALLE();
            cotDetBase = cotDet;

            tipoCambio = tc;
            moneda = mon;
        }

        private void AgregarEquipo_Load(object sender, EventArgs e)
        {
            if (!string.IsNullOrWhiteSpace(moneda) && !string.IsNullOrWhiteSpace(tipoCambio))
            {
                txtMoneda.Text = moneda;
                txtTipocambio.Text = tipoCambio;

                if (cotDetBase != null) //se agrega una alternativa
                {                    
                    selectedEquipo = ctEquipo.getEquipo(cotDetBase.idEquipo);
                    selectedListCaracteristica = ctCaracteristica.getListCaracteristicas(cotDetBase.idEquipo);
                    txtBusqueda.Text = cotDetBase.nombreEquipo;

                    //rellenamos las caracteristicas
                    gridEspecTecnicas.DataSource = null;
                    gridEspecTecnicas.DataSource = selectedListCaracteristica;

                    txtCantidad.Text = cotDetBase.cantidad.Value.ToString();
                    txtMontoTarifa.Text = cotDetBase.montoTarifa.Value.ToString("N");
                    txtTarifa.Text = cotDetBase.tarifa.Value.ToString("N");
                    txtDescuento.Text = cotDetBase.dscto.Value.ToString("N");
                    txtTarifaTotal.Text = cotDetBase.tarifaTotal.Value.ToString("N");
                }
            }
        }

        private void btnBuscar_Click(object sender, EventArgs e)
        {
            DialogSearchObject buscarEquipo = new DialogSearchObject("Equipo");
            if (buscarEquipo.ShowDialog(this) == DialogResult.OK)
            {
                string idEquipo = buscarEquipo.ResultadoBusqueda;

                if (!string.IsNullOrWhiteSpace(idEquipo))
                {
                    selectedEquipo = ctEquipo.getEquipo(idEquipo);
                    selectedListCaracteristica = ctCaracteristica.getListCaracteristicas(idEquipo);
                    selectedListaTarifa = ctListaTarifa.getListTarifa(idEquipo);

                    txtBusqueda.Text = selectedEquipo.nombreEquipo;
                    
                    //rellenamos las caracteristicas
                    gridEspecTecnicas.DataSource = null;
                    gridEspecTecnicas.DataSource = selectedListCaracteristica;

                    //las tarifas se muestran al seleccionar el tipo de tarifas                  
                    this.setReadOnlyRows();
                    this.limpiarControles();
                }
            }
        }

        private void limpiarControles()
        {
            cmbTipoTarifa.SelectedIndex = -1;
            txtCantidad.ResetText();
            checkDsctoDocumento.Checked = false;
            txtMontoTarifa.ResetText();
            txtHoraTarifa.ResetText();
            txtTarifa.ResetText();
            txtValDscto.ResetText();
            txtDescuento.ResetText();
            txtTarifaTotal.ResetText();
        }

        private void gridEspecTecnicas_DataBindingComplete(object sender, DataGridViewBindingCompleteEventArgs e)
        {
            if (gridEspecTecnicas.DataSource != null)
            {
                gridEspecTecnicas.Columns["idCaracteristica"].Visible = false;
                gridEspecTecnicas.Columns["nombreCaracteristica"].HeaderText = "Característica";
                gridEspecTecnicas.Columns["descripcion"].HeaderText = "Descripción";
                gridEspecTecnicas.Columns["idequipo"].Visible = false;
                gridEspecTecnicas.Columns["eliminado"].Visible = false;
                gridEspecTecnicas.Columns["statusflag"].Visible = false;
                gridEspecTecnicas.Columns["EQUIPO"].Visible = false;
            }
        }

        internal void setReadOnlyRows()
        {
            if (gridEspecTecnicas.Rows.Count > 0)
            {
                foreach (DataGridViewRow dr in gridEspecTecnicas.Rows)
                {
                    dr.ReadOnly = true;
                }
            }
        }

        private void txtCantidad_KeyPress(object sender, KeyPressEventArgs e)
        {
            if (char.IsDigit(e.KeyChar) || char.IsControl(e.KeyChar))
            {
                e.Handled = false;
            }
            else
            {
                e.Handled = true;
            }
        }

        #region Tarifa

        private void calcularTarifasDia()
        {
            if (!string.IsNullOrWhiteSpace(txtHoraTarifa.Text))
            {
                try
                {
                    double numDia = Convert.ToDouble(txtHoraTarifa.Text);

                    if (!string.IsNullOrWhiteSpace(txtMontoTarifa.Text))
                    {
                        //calculamos la tarifa
                        double tarifa = Convert.ToDouble(txtMontoTarifa.Text);
                        double tarifaxDia = numDia * tarifa;
                        txtTarifa.Text = tarifaxDia.ToString("N");

                        this.calcularDescuento();
                    }
                    else
                    {
                        txtTarifa.ResetText();
                        txtTarifaTotal.ResetText();
                    }
                }
                catch (FormatException)
                {
                    if (txtHoraTarifa.Text != ".")
                    {
                        txtHoraTarifa.ResetText();
                    }
                }
            }
            else
            {
                txtHoraTarifa.ResetText();
                txtTarifa.ResetText();
                txtValDscto.ResetText();
                txtDescuento.ResetText();
                txtTarifaTotal.ResetText();
            }
        }

        private void calcularDescuento()
        {
            if (!string.IsNullOrWhiteSpace(txtValDscto.Text))
            {
                if (!string.IsNullOrWhiteSpace(txtTarifa.Text))
                {
                    try
                    {
                        double tarifa = Convert.ToDouble(txtTarifa.Text);
                        double dscto = Convert.ToDouble(txtValDscto.Text) / 100;
                        double valDscto = tarifa * dscto;

                        txtDescuento.Text = valDscto.ToString("N");

                        this.calcularTotalTarifa();
                    }
                    catch (FormatException)
                    {
                        if (txtValDscto.Text != ".")
                        {
                            txtValDscto.Text = string.Empty;
                        }
                    }
                }
                else
                {
                    txtValDscto.ResetText();
                    txtDescuento.ResetText();
                }
            }
            else
            {
                if (!string.IsNullOrWhiteSpace(txtTarifa.Text))
                {
                    txtTarifaTotal.Text = txtTarifa.Text;
                    txtDescuento.ResetText();
                }
            }
        }

        private void calcularTotalTarifa()
        {
            if (!string.IsNullOrWhiteSpace(txtTarifa.Text) && !string.IsNullOrWhiteSpace(txtDescuento.Text))
            {
                txtTarifaTotal.Text = (Convert.ToDouble(txtTarifa.Text) - Convert.ToDouble(txtDescuento.Text)).ToString("N");
            }
            else
            {
                if (string.IsNullOrWhiteSpace(txtTarifa.Text) || string.IsNullOrWhiteSpace(txtDescuento.Text))
                {
                    txtTarifaTotal.Text = txtTarifa.Text;
                }
            }
        }

        private void txtnumDia_KeyPress(object sender, KeyPressEventArgs e)
        {
            if (char.IsDigit(e.KeyChar) || char.IsControl(e.KeyChar) || e.KeyChar == '.')
            {
                e.Handled = false;
            }
            else
            {
                e.Handled = true;
            }
        }

        private void txtnumDia_KeyUp(object sender, KeyEventArgs e)
        {
            this.calcularTarifasDia();
        }

        private void txtTarifaHoraDia_KeyPress(object sender, KeyPressEventArgs e)
        {
            if (char.IsDigit(e.KeyChar) || char.IsControl(e.KeyChar) || e.KeyChar == '.')
            {
                e.Handled = false;
            }
            else
            {
                e.Handled = true;
            }
        }

        private void txtTarifaHoraDia_KeyUp(object sender, KeyEventArgs e)
        {
            this.calcularTarifasDia();
        }

        private void txtValDscto_KeyPress(object sender, KeyPressEventArgs e)
        {
            if (char.IsDigit(e.KeyChar) || char.IsControl(e.KeyChar) || e.KeyChar == '.')
            {
                e.Handled = false;
            }
            else
            {
                e.Handled = true;
            }
        }

        private void txtValDscto_KeyUp(object sender, KeyEventArgs e)
        {
            this.calcularDescuento();
        }

        #endregion

        private void btnAgregar_Click(object sender, EventArgs e)
        {
            //verificamos que los campos esten rellenados
            if (!string.IsNullOrWhiteSpace(selectedEquipo.idEquipo))
            {
                if (!string.IsNullOrWhiteSpace(txtCantidad.Text))
                {
                    if (cmbTipoTarifa.SelectedIndex >= 0)
                    {
                        if (!existeFilaVacia())
                        {
                            if (string.IsNullOrWhiteSpace(txtDescuento.Text)) txtDescuento.Text = "0";

                            result = new COTIZACION_DETALLE()
                            {
                                idEquipo = selectedEquipo.idEquipo,
                                nombreEquipo = selectedEquipo.nombreEquipo,
                                codigoEquipo = selectedEquipo.codigo,
                                serieEquipo = string.Empty,
                                moneda = moneda,
                                eliminado = 0,
                                dsctoenDocumento = checkDsctoDocumento.Checked ? 1 : 0,

                                cantidad = Convert.ToInt32(txtCantidad.Text),
                                tipoTarifa = cmbTipoTarifa.SelectedItem.ToString(),

                                horaTarifa = Convert.ToInt32(txtHoraTarifa.Text),
                                montoTarifa = Convert.ToDecimal(txtMontoTarifa.Text),
                                montoTarifaLoc = moneda == "Local" ? Convert.ToDecimal(txtMontoTarifa.Text) : Convert.ToDecimal(Convert.ToDouble(txtMontoTarifa.Text) * Convert.ToDouble(tipoCambio)),
                                montoTarifaExt = moneda == "Extranjera" ? Convert.ToDecimal(txtMontoTarifa.Text) : Convert.ToDecimal(Convert.ToDouble(txtMontoTarifa.Text) / Convert.ToDouble(tipoCambio)),
                                tarifa = Convert.ToDecimal(txtTarifa.Text),
                                tarifaLoc = moneda == "Local" ? Convert.ToDecimal(txtTarifa.Text) : Convert.ToDecimal(Convert.ToDouble(txtTarifa.Text) * Convert.ToDouble(tipoCambio)),
                                tarifaExt = moneda == "Extranjera" ? Convert.ToDecimal(txtTarifa.Text) : Convert.ToDecimal(Convert.ToDouble(txtTarifa.Text) / Convert.ToDouble(tipoCambio)),
                                dscto = Convert.ToDecimal(txtDescuento.Text),
                                dsctoLoc = moneda == "Local" ? Convert.ToDecimal(txtDescuento.Text) : Convert.ToDecimal(Convert.ToDouble(txtDescuento.Text) * Convert.ToDouble(tipoCambio)),
                                dsctoExt = moneda == "Extranjera" ? Convert.ToDecimal(txtDescuento.Text) : Convert.ToDecimal(Convert.ToDouble(txtDescuento.Text) / Convert.ToDouble(tipoCambio)),
                                tarifaTotal = Convert.ToDecimal(txtTarifaTotal.Text),
                                tarifaTotalLoc = moneda == "Local" ? Convert.ToDecimal(txtTarifaTotal.Text) : Convert.ToDecimal(Convert.ToDouble(txtTarifaTotal.Text) * Convert.ToDouble(tipoCambio)),
                                tarifaTotalExt = moneda == "Extranjera" ? Convert.ToDecimal(txtTarifaTotal.Text) : Convert.ToDecimal(Convert.ToDouble(txtTarifaTotal.Text) / Convert.ToDouble(tipoCambio))
                            };
                        }
                        else
                        {
                            MessageBox.Show(this, "La tarifa presenta campos en blanco", "Cotizav", MessageBoxButtons.OK, MessageBoxIcon.Exclamation, MessageBoxDefaultButton.Button1);                                                        
                        }
                    }
                    else
                    {
                        MessageBox.Show(this, "Seleccione el tipo de tarifa", "Cotizav", MessageBoxButtons.OK, MessageBoxIcon.Exclamation, MessageBoxDefaultButton.Button1);                        
                    }
                }
                else
                {
                    MessageBox.Show(this, "Ingrese cantidad de equipos a cotizar", "Cotizav", MessageBoxButtons.OK, MessageBoxIcon.Exclamation, MessageBoxDefaultButton.Button1);
                }
            }
            else
            {
                MessageBox.Show(this, "Seleccione el equipo a cotizar", "Cotizav", MessageBoxButtons.OK, MessageBoxIcon.Exclamation, MessageBoxDefaultButton.Button1);
            }
        }

        private bool existeFilaVacia()
        {
            if (!string.IsNullOrWhiteSpace(txtHoraTarifa.Text) &&
                !string.IsNullOrWhiteSpace(txtMontoTarifa.Text) &&
                !string.IsNullOrWhiteSpace(txtTarifa.Text))
            {
                return false;
            }
            else
            {
                return true;
            }
        }

        private void cmbTipoTarifa_SelectionChangeCommitted(object sender, EventArgs e)
        {
            if (cmbTipoTarifa.SelectedIndex >= 0)
            {
                if (selectedListaTarifa != null)
                {
                    string selectedTarifa = cmbTipoTarifa.SelectedItem.ToString();
                    switch (selectedTarifa)
                    {
                        case "Día":
                            txtHoraTarifa.Text = selectedListaTarifa.horaxdia.GetValueOrDefault().ToString();
                            txtMontoTarifa.Text = selectedListaTarifa.tarifaHoraDia.GetValueOrDefault().ToString("N", CultureInfo.InvariantCulture);
                            txtTarifa.Text = selectedListaTarifa.tarifaTotalDia.GetValueOrDefault().ToString("N", CultureInfo.InvariantCulture);
                            break;
                        case "Semana":
                            txtHoraTarifa.Text = selectedListaTarifa.horaxsemana.GetValueOrDefault().ToString();
                            txtMontoTarifa.Text = selectedListaTarifa.tarifaHoraSemana.GetValueOrDefault().ToString("N", CultureInfo.InvariantCulture);
                            txtTarifa.Text = selectedListaTarifa.tarifaTotalSemana.GetValueOrDefault().ToString("N", CultureInfo.InvariantCulture);
                            break;
                        case "Mes":
                            txtHoraTarifa.Text = selectedListaTarifa.horaxmes.GetValueOrDefault().ToString();
                            txtMontoTarifa.Text = selectedListaTarifa.tarifaHoraMes.GetValueOrDefault().ToString("N", CultureInfo.InvariantCulture);
                            txtTarifa.Text = selectedListaTarifa.tarifaTotalMes.GetValueOrDefault().ToString("N", CultureInfo.InvariantCulture);
                            break;
                    }
                    this.calcularTarifasDia();
                }
                Double ceroDscto = 0;
                txtDescuento.Text = ceroDscto.ToString("N");
            }
            else
            {
                txtHoraTarifa.ResetText();
                txtMontoTarifa.ResetText();
                txtTarifa.ResetText();
                txtDescuento.ResetText();
                txtValDscto.ResetText();
                txtTarifaTotal.ResetText();
            }
        }
    }
}
